/*
 * @Author: 9ilk 3535851673@qq.com
 * @Date: 2025-01-19 14:55:27
 * @LastEditors: 9ilk 3535851673@qq.com
 * @LastEditTime: 2025-01-22 21:59:39
 * @FilePath: /zhuang/httpserver/HttpServer.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once
#include <iostream>
#include <string>
#include "TcpServer.hpp"
#include"HttpProtocol.hpp"

using namespace TcpServerModule;
using http_hander_t =  function<void(HttpRequest&,HttpResponse&)>;

class HttpServer
{
public:
   HttpServer(int port)
       : _tsvr(make_unique<TcpServer>(port))
   {
   }

   void Register(string funcname,http_hander_t func)
   {
      _route[funcname] = func;
   }

   bool SafeCheck(const string& service)
   {
      auto iter = _route.find(service);
      return  iter != _route.end();
   }


   void Start()
   {
      _tsvr->InitServer([this](SockPtr sockfd, InetAddr client)
                        { return this->HandlerRequest(sockfd, client); });
      _tsvr->Loop(); // tcp服务器循环
   }
   // 处理http的入口
   bool HandlerRequest(SockPtr sockfd, InetAddr client) // 第一个参数是客户端是谁
   {
      LOG(LogLevel::DEBUG) << "HttpServer: get a new client: " << sockfd->Fd() << "addr info: " << client.Addr();
      string http_request;
      sockfd->Recv(&http_request); //不做报文完整性的处理
      HttpRequest req;
      req.Deserialize(http_request); //反序列化
      req.Print();
      HttpResponse resp;//应答
      //请求应该分为两类：1. 请求一般的静态资源 2.提交参数，携带参数，需要进行交互设置
      if(req.IsHasArgs())
      {   //处理情况2 
         string service = req.Path();
         if(SafeCheck(service))
         _route[req.Path()](req,resp); //回调调用之前注册的方法v
         else
           resp.Build(req); //此时说明访问资源不存在就会走到404
      }
      else
      {
         resp.Build(req); //构建应答
      }
      string resp_str; 
      resp.Serialize(&resp_str); //序列化
     // cout << "这是报文: " << resp_str << endl;
      sockfd->Send(resp_str);
      return true;
//       cout << http_request;
//       // 读取请求，对其进行分析处理->文本处理！
//       // 1.读取请求的完整性 --- 暂时不做
//       // 2.完整htttp反序列化，http response序列化
//       // demo1:直接返回一个固定的内容
//       string status_line = "HTTP/1.1 200 OK" + Sep + Blank_line; // 状态行 + 空行
//       //直接返回一个html网页
//       string body = "<!DOCTYPE html>\
// <html lang=\"zh\">\
// <head>\
//     <meta charset=\"UTF-8\">\
//     <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\
//     <title>苏不语你好</title>\
// </head>\
// <body>\
//     <h1>Mr.Xuan 你好</h1>\
//     <img src=\"https://p1.ssl.qhimg.com/dr/220__/t01fcd4843c0b57daac.jpg\" alt=\"Image\">\
// </body>\
// </html>\
// ";
//       string httpresponse = status_line + body;
      // sockfd->Send(httpresponse);
      return true;
   }
   ~HttpServer() {}

private:
   unique_ptr<TcpServer> _tsvr;
   unordered_map<string,http_hander_t> _route;//功能路由
};